package br.ufpe.cin.ip.biblioteca.repositorios;

import br.ufpe.cin.ip.biblioteca.entidades.Funcionario;
import br.ufpe.cin.ip.biblioteca.excecoes.FuncionarioJaCadastradoException;
import br.ufpe.cin.ip.biblioteca.excecoes.FuncionarioNaoEncontradoException;
import br.ufpe.cin.ip.biblioteca.excecoes.RepositorioException;
import br.ufpe.cin.ip.biblioteca.iterator.IteratorFuncionario;
import br.ufpe.cin.ip.biblioteca.iterator.IteratorFuncionarioLista;
import br.ufpe.cin.ip.biblioteca.tad.ListaFuncionario;

public class RepositorioFuncionarioLista implements RepositorioFuncionario {
	private ListaFuncionario funcionarios;
	
	@Override
	public void adicionar(Funcionario funcionario) throws RepositorioException, FuncionarioJaCadastradoException {
		if(this.funcionarios!=null) {
			if(this.existe(funcionario)) {
				throw new FuncionarioJaCadastradoException();
			} else {
				this.funcionarios.inserir(funcionario);
			}
		} else {
			this.funcionarios = new ListaFuncionario(funcionario);
		}
	}
	
	@Override
	public void remover(Funcionario funcionario) throws RepositorioException, FuncionarioNaoEncontradoException {
		if(this.existe(funcionario)) {
			this.funcionarios.remover(funcionario);
		} else {
			throw new FuncionarioNaoEncontradoException();
		}
	}
	
	@Override
	public void atualizar(Funcionario funcionario) throws RepositorioException, FuncionarioNaoEncontradoException {
		if(this.funcionarios!=null) {
			Funcionario retorno = null;
			IteratorFuncionario it = this.funcionarios.getIterator();
			
			while(it.hasNext()) {
				Funcionario f = it.next();
				
				if(funcionario.equals(f))
					retorno = f;
			}
			
			if(retorno==null) {
				throw new FuncionarioNaoEncontradoException();
			} else {
				retorno.setLogin(funcionario.getLogin());
				retorno.setSenha(funcionario.getSenha());
				retorno.setNome(funcionario.getNome());
				retorno.setMatricula(funcionario.getMatricula());
			}
		} else {
			throw new FuncionarioNaoEncontradoException();
		}
	}
	
	@Override
	public Funcionario buscar(Funcionario funcionario) throws RepositorioException, FuncionarioNaoEncontradoException {
		if(this.funcionarios!=null) {
			Funcionario retorno = null;
			IteratorFuncionario it = this.funcionarios.getIterator();
			
			while(it.hasNext()) {
				Funcionario f = it.next();
				
				if(funcionario.equals(f))
					retorno = f;
			}
			
			if(retorno==null) {
				throw new FuncionarioNaoEncontradoException();
			} else {
				return retorno;
			}
		} else {
			throw new FuncionarioNaoEncontradoException();
		}
	}
	
	@Override
	public IteratorFuncionario getIterator() {
		return new IteratorFuncionarioLista(this.funcionarios);
	}
	
	@Override
	public boolean existe(Funcionario funcionario) throws RepositorioException {
		boolean retorno = false;
		
		if(this.funcionarios!=null) {
			IteratorFuncionario it = this.funcionarios.getIterator();
			
			while(it.hasNext()) {
				Funcionario f = it.next();
				
				if(funcionario.equals(f))
					retorno = true;
			}
		}
		
		return retorno;
	}
}
